/**
 * 教师看板校领导全考试视图功能测试
 * 
 * 测试校领导角色不传班级ID获取全考试数据的功能
 */
public class TeacherDashboardSchoolAdminGlobalViewTest {
    
    /**
     * 测试校领导全考试视图功能
     * 
     * 功能说明：
     * 1. 校领导角色可以不传递班级ID，获取整个考试的全部数据
     * 2. 普通教师必须传递班级ID，且只能访问自己负责的班级
     * 3. 全考试视图包含学生排名、综合分析、各科成绩分析等跨班级数据
     * 
     * 实现逻辑：
     * - validateTeacherDashboardRequest：校领导可以不传classId，普通教师必须传classId
     * - getGlobalExamDashboard：获取全考试范围的数据
     * - getClassSpecificDashboard：获取特定班级的数据
     */
    public static void testSchoolAdminGlobalView() {
        System.out.println("=== 教师看板校领导全考试视图功能测试 ===");
        
        System.out.println("\n测试场景1：校领导获取全考试数据（不传班级ID）");
        System.out.println("- 用户ID: 1001 (具有school_admin角色)");
        System.out.println("- 班级ID: null (不传递)");
        System.out.println("- 考试ID: 1");
        System.out.println("- 预期结果: 返回全考试范围的数据，包含所有班级的学生排名、成绩分析等");
        System.out.println("- 数据范围: 跨班级的全考试统计");
        
        System.out.println("\n测试场景2：校领导查看特定班级数据（传递班级ID）");
        System.out.println("- 用户ID: 1001 (具有school_admin角色)");
        System.out.println("- 班级ID: 2");
        System.out.println("- 考试ID: 1");
        System.out.println("- 预期结果: 返回指定班级的数据");
        System.out.println("- 数据范围: 基于班级的统计");
        
        System.out.println("\n测试场景3：普通教师尝试不传班级ID（应该失败）");
        System.out.println("- 用户ID: 2001 (普通教师角色)");
        System.out.println("- 班级ID: null (不传递)");
        System.out.println("- 考试ID: 1");
        System.out.println("- 预期结果: 抛出异常 '普通教师必须指定班级ID'");
        
        System.out.println("\n测试场景4：普通教师查看自己班级数据");
        System.out.println("- 用户ID: 2001 (普通教师角色)");
        System.out.println("- 班级ID: 2 (该教师负责的班级)");
        System.out.println("- 考试ID: 1");
        System.out.println("- 预期结果: 返回该班级的数据");
        System.out.println("- 数据范围: 基于班级的统计");
        
        System.out.println("\n核心实现逻辑:");
        System.out.println("```java");
        System.out.println("// 在getTeacherDashboard方法中");
        System.out.println("boolean isSchoolAdmin = permissionService.hasAnyRoles(reqVO.getTeacherId(), \"school_admin\");");
        System.out.println("boolean isGlobalView = isSchoolAdmin && reqVO.getClassId() == null;");
        System.out.println("");
        System.out.println("if (isGlobalView) {");
        System.out.println("    // 校领导获取全考试数据");
        System.out.println("    return getGlobalExamDashboard(reqVO);");
        System.out.println("} else {");
        System.out.println("    // 普通教师或校领导查看特定班级数据");
        System.out.println("    return getClassSpecificDashboard(reqVO);");
        System.out.println("}");
        System.out.println("```");
        
        System.out.println("\n数据获取差异:");
        System.out.println("\n1. 学生排名:");
        System.out.println("   - 班级视图: getTopStudents(classId, examId, 10) - 班级前10名");
        System.out.println("   - 全考试视图: getGlobalTopStudents(examId, 10) - 全考试前10名");
        
        System.out.println("\n2. 成绩统计:");
        System.out.println("   - 班级视图: getClassScoreStatistics(classId, examId) - 班级统计");
        System.out.println("   - 全考试视图: getGlobalScoreStatistics(examId) - 全考试统计");
        
        System.out.println("\n3. 综合分析:");
        System.out.println("   - 班级视图: getAdmissionAnalysisInfo(classId, examId) - 班级升学分析");
        System.out.println("   - 全考试视图: getGlobalAdmissionAnalysis(examId) - 全考试升学分析");
        
        System.out.println("\n4. 对比分析:");
        System.out.println("   - 班级视图: getComparisonAnalysis(classId, examId) - 班级与其他班级对比");
        System.out.println("   - 全考试视图: getGlobalComparisonAnalysis(examId) - 全考试整体分析");
    }
    
    /**
     * API接口调用示例
     */
    public static void showApiExamples() {
        System.out.println("\n=== API接口调用示例 ===");
        
        System.out.println("\n1. 校领导获取全考试数据（推荐用法）:");
        System.out.println("GET /admin-api/system/teacher-dashboard/get?teacherId=1001&examId=1&includeScoreStatistics=true&includeStudentRanking=true&includeAdmissionAnalysis=true");
        System.out.println("说明: 不传classId，获取考试1的全部数据");
        
        System.out.println("\n2. 校领导查看特定班级:");
        System.out.println("GET /admin-api/system/teacher-dashboard/get?teacherId=1001&classId=2&examId=1&includeComparison=true");
        System.out.println("说明: 传递classId=2，查看特定班级数据");
        
        System.out.println("\n3. 普通教师查看自己班级:");
        System.out.println("GET /admin-api/system/teacher-dashboard/get?teacherId=1002&classId=2&examId=1");
        System.out.println("说明: 教师1002查看自己负责的班级2");
        
        System.out.println("\n4. 错误示例 - 普通教师不传classId:");
        System.out.println("GET /admin-api/system/teacher-dashboard/get?teacherId=1002&examId=1");
        System.out.println("错误响应: {\"code\": 500, \"message\": \"普通教师必须指定班级ID\"}");
        
        System.out.println("\n5. 错误示例 - 普通教师访问其他班级:");
        System.out.println("GET /admin-api/system/teacher-dashboard/get?teacherId=1002&classId=3&examId=1");
        System.out.println("错误响应: {\"code\": 500, \"message\": \"教师与班级不匹配\"}");
    }
    
    /**
     * 数据结构对比
     */
    public static void showDataStructureComparison() {
        System.out.println("\n=== 数据结构对比 ===");
        
        System.out.println("\n班级视图响应示例:");
        System.out.println("{");
        System.out.println("  \"classInfo\": {");
        System.out.println("    \"classId\": 2,");
        System.out.println("    \"className\": \"高三(2)班\",");
        System.out.println("    \"totalStudents\": 45");
        System.out.println("  },");
        System.out.println("  \"latestExam\": {");
        System.out.println("    \"classAvgScore\": 620.5,");
        System.out.println("    \"classRankInGrade\": 2,");
        System.out.println("    \"participantCount\": 44");
        System.out.println("  },");
        System.out.println("  \"studentRanking\": {");
        System.out.println("    \"topStudents\": [\"班级前10名学生\"]");
        System.out.println("  }");
        System.out.println("}");
        
        System.out.println("\n全考试视图响应示例:");
        System.out.println("{");
        System.out.println("  \"classInfo\": null,");
        System.out.println("  \"latestExam\": {");
        System.out.println("    \"classAvgScore\": 580.3,");
        System.out.println("    \"classRankInGrade\": 1,");
        System.out.println("    \"participantCount\": 360");
        System.out.println("  },");
        System.out.println("  \"studentRanking\": {");
        System.out.println("    \"topStudents\": [\"全考试前10名学生（跨班级）\"]");
        System.out.println("  },");
        System.out.println("  \"scoreStatistics\": {");
        System.out.println("    \"totalScore\": {");
        System.out.println("      \"avgScore\": 580.3,");
        System.out.println("      \"gradeRank\": 1,");
        System.out.println("      \"gradeAvgDiff\": 0");
        System.out.println("    }");
        System.out.println("  }");
        System.out.println("}");
    }
    
    /**
     * 功能特点总结
     */
    public static void showFeatureSummary() {
        System.out.println("\n=== 功能特点总结 ===");
        
        System.out.println("\n✅ 已实现的功能:");
        System.out.println("1. 校领导角色权限检查");
        System.out.println("2. 校领导可不传班级ID获取全考试数据");
        System.out.println("3. 普通教师必须传班级ID且只能访问自己班级");
        System.out.println("4. 全考试视图的学生排名（跨班级前N名）");
        System.out.println("5. 全考试视图的成绩统计（整体统计）");
        System.out.println("6. 全考试视图的升学分析（整体分析）");
        System.out.println("7. 全考试视图的对比分析（整体对比）");
        System.out.println("8. 全考试视图的教学建议（整体建议）");
        System.out.println("9. 详细的权限验证和错误处理");
        System.out.println("10. 完整的日志记录");
        
        System.out.println("\n🔧 技术实现:");
        System.out.println("- 使用PermissionService进行角色验证");
        System.out.println("- 分离全考试数据获取方法和班级数据获取方法");
        System.out.println("- 支持动态数据范围切换");
        System.out.println("- 保持向后兼容性");
        
        System.out.println("\n📊 数据范围:");
        System.out.println("- 班级视图: 基于单个班级的数据统计和分析");
        System.out.println("- 全考试视图: 基于整个考试的跨班级数据统计和分析");
        System.out.println("- 自动适配: 根据用户角色和参数自动选择数据范围");
    }
    
    public static void main(String[] args) {
        testSchoolAdminGlobalView();
        showApiExamples();
        showDataStructureComparison();
        showFeatureSummary();
    }
}